home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / amiga / asrc29k.lha / fingerd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-08  |  2.3 KB  |  115 lines

  1. /* Finger server */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "global.h"
  5. #include "files.h"
  6. #include "mbuf.h"
  7. #include "socket.h"
  8. #include "session.h"
  9. #include "proc.h"
  10. #include "dirutil.h"
  11. #include "commands.h"
  12. #include "mailbox.h"
  13. #include "config.h"
  14.  
  15. static int Sfinger = -1;    /* Prototype socket for service */
  16.  
  17. static void fingerd __ARGS((int s,void *unused,void *p));
  18.  
  19. /* Start up finger service */
  20. int
  21. finstart(argc,argv,p)
  22. int argc;
  23. char *argv[];
  24. void *p;
  25. {
  26.     struct sockaddr_in lsocket;
  27.     int s;
  28.  
  29.     if(Sfinger != -1){
  30.         freeargs(argc,argv);
  31.         return 0;
  32.     }
  33.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  34.     chname(Curproc,"Finger listener");
  35.  
  36.     lsocket.sin_family = AF_INET;
  37.     lsocket.sin_addr.s_addr = INADDR_ANY;
  38.     if(argc < 2)
  39.         lsocket.sin_port = IPPORT_FINGER;
  40.     else
  41.         lsocket.sin_port = atoi(argv[1]);
  42.  
  43.     freeargs(argc,argv);
  44.     Sfinger = socket(AF_INET,SOCK_STREAM,0);
  45.     bind(Sfinger,(char *)&lsocket,sizeof(lsocket));
  46.     listen(Sfinger,1);
  47.     for(;;){
  48.         if((s = accept(Sfinger,NULLCHAR,(int *)NULL)) == -1)
  49.             break;    /* Service is shutting down */
  50.  
  51.         /* Spawn a server */
  52.         newproc("fingerd",512,fingerd,s,NULL,NULL);
  53.     }
  54.     return 0;
  55. }
  56. static void
  57. fingerd(s,unused,p)
  58. int s;
  59. void *unused;
  60. void *p;
  61. {
  62.     char user[80];
  63.     FILE *fp;
  64.     char *file,*cp;
  65.  
  66.     sockowner(s,Curproc);
  67.     mainlog(s,"open Finger");
  68.     recvline(s,user,80);
  69.     rip(user);
  70.     if(strlen(user) == 0){
  71.         fp = dir(Fdir,0);
  72.         if(fp == NULLFILE)
  73.             usprintf(s,"No finger information available\n");
  74.         else
  75.             usprintf(s,"Known users on this system:\n");
  76.     } else {
  77.         file = pathname(Fdir,user);
  78.         cp = pathname(Fdir,"");
  79.         /* Check for attempted security violation (e.g., somebody
  80.          * might be trying to finger "../ftpusers"!)
  81.          */
  82.         if(strncmp(file,cp,strlen(cp)) != 0){
  83.             fp = NULLFILE;
  84.             usprintf(s,"Invalid user name %s\n",user);
  85.         } else if((fp = fopen(file,READ_TEXT)) == NULLFILE)
  86.             usprintf(s,"User %s not known\n",user);
  87.         free(cp);
  88.         free(file);
  89.     }
  90.     if(fp != NULLFILE){
  91.         sendfile(fp,s,ASCII_TYPE,0);
  92.         fclose(fp);
  93.     }
  94. #ifdef    MAILBOX
  95.     if(strlen(user) == 0){
  96.         usprintf(s,"\nCurrent remote users:\n");
  97.         close_s(Curproc->output);
  98.         Curproc->output = s;
  99.         domboxdisplay(0,NULLCHARP,NULL);
  100.     }
  101. #endif
  102.     close_s(s);
  103.     mainlog(s,"close Finger");
  104. }
  105. int
  106. fin0(argc,argv,p)
  107. int argc;
  108. char *argv[];
  109. void *p;
  110. {
  111.     close_s(Sfinger);
  112.     Sfinger = -1;
  113.     return 0;
  114. }
  115.